package com.kaifamiao.map;

import java.util.HashMap;

/**
 * 1、将 键值对 添加到 HashMap 中时，会根据 键 的 hashCode 来确定 键值对 的存放位置
 * 2、在 HashMap 内部 采用 数组 + 链表 + 红黑树 来存储键值对
 * 3、HashMap 的直接父类是 AbstractMap类
 * 4、HashMap 中的 键 和 值 都可以为 null
 * 5、HashMap 不是 线程安全 的
 */
public class AnalyseHashMap {

    public static void main(String[] args) {

        HashMap<String,Integer> map = new HashMap<>( 10, 0.8f );

        map.put( "儿女" , 2 );
        map.put( "农丰" , 18 );

        System.out.println( map );

        // 0b0000_0000_0000_0000_0000_1000_0000_0111
        System.out.println( Integer.numberOfLeadingZeros(2055 ) );

        int h = hash( "李芳" );
        System.out.println( h );
        System.out.println( ( 10 - 1 ) & h );

        System.out.println( "儿女".hashCode() );
        System.out.println( "农丰".hashCode() );

        System.out.println( ( 10 - 1 ) & hash( "儿女" ) );
        System.out.println( ( 10 - 1 ) & hash( "农丰" ) );

    }

    // 这是从 HashMap 中复制过来的方法
    public static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

}
